/*
 *  ttf文件解析,依赖 libfreetype
 *  注意库的头文件需包含到 -I./libs/include/freetype2
 */
#ifndef _LIB_FREETYPE_ADAPT_H_
#define _LIB_FREETYPE_ADAPT_H_

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C"
{
#endif

/* 对外句柄格式 */
#define FT_HANDLE void*

/* 字号+加粗+字体id 组合成font参数 */
#define FT_GET_FONT(size, bold, id) \
    (int32_t)((size * 10000) + (bold % 100 * 100) + (id % 100))

typedef struct
{
    int32_t width, height;       /* 目标输出点阵宽高(bitMap点阵就包含在内) */
    int32_t bitWidth, bitHeight; /* bitMap点阵宽高 */
    int32_t bitLeft, bitTop;     /* bitMap点阵相对 width*height 点阵左上角偏移量 */
    int32_t lineByte;            /* bitMap每行可用字节数(会有盈余,比如 bitWidth=6,而 lineByte 会给2字节) */
    uint8_t* bitMap; /* 实际有效点阵数组,字节数为 bitHeight*lineByte */
} FtBitMap;

/* 句柄初始化和释放 */
FT_HANDLE LibFtInit();

void LibFtRelease(FT_HANDLE handle);

/*  添加字体文件和对应id
 *  参数:
 *      ttfFile: 字体文件
 *      id: 字体代号,取值0~99,也就是最多只能添加100个字体文件
 *  返回: 0/成功 -1/失败
 */
int32_t LibFtAddFontFile(FT_HANDLE handle, const char* ttfFile, int32_t id);

/*
 *  根据utf8编码和字体,返回该字的矩阵数据
 *  参数:
 *      handle: 初始化ttf获得的指针
 *      utf8: utf-8编码
 *      font: 字体代号,格式:大小+加粗(2位)+字体id(2位) 例如320001,表示32*32大小,00号加粗,01号id
 *            可使用宏 FT_GET_FONT(size, bold, id) 来便捷生成最终值
 *      angle: 旋转角度0~360度,逆时针旋转
 *      map: 返回内存块信息体指针
 *      isGrayMap: 使用灰度图
 *  返回: 位移后的utf8指针(ascii为1字符,汉字为3字符,用户根据该返回值来确定下次的偏移量)
 *  注意: 检查 map->bitMap 是否为 NULL 来判定成功 (出现不可见字符时会出现跳过字符的情况)
 */
const char* LibFtGetMapByUtf8(
    FT_HANDLE handle,
    const char* utf8,
    int32_t font,
    int32_t angle,
    FtBitMap* map,
    bool isGrayMap);

/*
 *  根据utf8编码和字体,返回当前字符串最终输出时矩阵横向像素个数,用于确认当前输出的矩阵会不会超出屏幕或别的限制范围
 *  参数:
 *      utf8: 目标字符串
 *      font: 字体代号,格式:大小+加粗(2位)+字体id(2位) 例如320001,表示32*32大小,00号加粗,01号id
 *            可使用宏 FT_GET_FONT(size, bold, id) 来便捷生成最终值
 *      spaceX: 与字之间纵向间隔像素
 *      spaceY: 字与字之间横向间隔像素
 *      lineLimit: 横向一行限制像素数量,超出时换行,填<=0表示无限制
 *      angle: 旋转角度0~360度,逆时针旋转
 *      retW: 返回横向占用像素
 *      retH: 返回纵向占用像素
 *  返回: 0/成功 -1/失败
 */
int32_t LibFtGetSizeByUtf8(
    FT_HANDLE handle,
    const char *utf8,
    int32_t font,
    int32_t spaceX,
    int32_t spaceY,
    int32_t lineLimit,
    int32_t angle,
    int32_t* retW,
    int32_t* retH);

#ifdef __cplusplus
}
#endif

#endif // _LIB_FREETYPE_ADAPT_H_
